package models

import (
	"github.com/astaxie/beego/orm"
	"github.com/astaxie/beego/validation"
	"github.com/fwhezfwhez/errorx"
)

// 管理员
type Admin struct {
	Id       int64  `orm:"cloumn(id);pk" form:"id" json:"id"`
	UserName string `orm:"cloumn(user_name)" form:"user_name" json:"user_name"`
	Password string `orm:"cloumn(password)" form:"password" json:"password"`
}

// init
func init() {
	orm.RegisterModel(new(Admin))
}

// table name
func (m *Admin) TableName() string {
	return "admin"
}

// 验证数据
func (m *Admin) Validate() error {
	vali := validation.Validation{}
	vali.Required(m.UserName, "user_name").Message("用户名不能为空")
	vali.Required(m.Password, "password").Message("密码不能为空")
	if vali.HasErrors() {
		return errorx.New(vali.Errors[0])
	}

	data, err := GetAdminByName(m.UserName)
	if err != nil {
		return errorx.New(err)
	}
	if data != nil {
		return errorx.NewFromString("用户名已存在")
	}

	return nil
}

// 根据id获取管理员信息
func GetAdminById(id int64) (*Admin, error) {
	data := &Admin{Id: id}
	if err := orm.NewOrm().Read(data); err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		return nil, errorx.New(err)
	}
	return data, nil
}

// 根据用户名获取管理员信息
func GetAdminByName(userName string) (*Admin, error) {
	data := &Admin{}
	if err := orm.NewOrm().QueryTable(data.TableName()).Filter("user_name", userName).One(data); err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		return nil, errorx.New(err)
	}
	return data, nil
}

// 添加管理员
func AddAdmin(data *Admin) error {
	num, err := orm.NewOrm().Insert(data)
	if err != nil {
		return errorx.New(err)
	}
	if num == 0 {
		return errorx.NewFromString("Failure to insert data")
	}
	return nil
}

// 根据id删除管理员
func DeleteAdminById(id int64) error {
	data := &Admin{Id: id}
	num, err := orm.NewOrm().Delete(data)
	if err != nil {
		return errorx.New(err)
	}
	if num == 0 {
		return errorx.NewFromString("Failure to delete data")
	}
	return nil
}
